/* 未获取锁的情况下读写文件 */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/file.h>
#include <string.h>

int main(int argc, char *argv[])
{
    char buf[100] = "Hello World!";
    int fd;
    int len;

    if (2 != argc) {
        printf("Usage: %s <filename>\n", argv[0]);
        exit(-1);
    }

    /* 打开文件 */
    fd = open(argv[1], O_RDWR);
    if (-1 == fd) {
        perror("open error");
        exit(-1);
    }
    /* 以非阻塞方式对文件加锁（派他锁） */
    if (-1 == flock(fd, LOCK_EX | LOCK_NB)) {
        perror("进程2：文件加锁失败");
    } else {
        printf("进程2：文件加锁成功.\n");
    }
    /* 写文件 */
    len = strlen(buf);
    if (0 > write(fd, buf, len)) {
        perror("进程2:写文件失败");
        exit(-1);
    }
    printf("进程2：写入到文件的字符串<%s>\n", buf);
    /* 将文件读写位置移动到文件头 */
    if (0 > lseek(fd, 0, SEEK_SET)) {
        perror("进程2:文件移动失败");
        exit(-1);
    }
    /* 读取文件 */
    memset(buf, 0x0, sizeof(buf));
    len = read(fd, buf, sizeof(buf));
    if (0 > len) {
        perror("进程2:读取文件失败");
        exit(-1);
    }
    printf("进程2:读取文件的字符串<%s>\n", buf);
    /* 解锁文件 */
    if (-1 == flock(fd, LOCK_UN)) {
        perror("进程2:文件解锁失败");
    } else {
        printf("进程2:文件解锁成功.\n");
    }
    /* 关闭文件 */
    close(fd);
    return 0;
}
